#!/bin/bash


:<<memoName

https://blog.csdn.net/llljjlj/article/details/89810340

1.作用
Linux系统中grep命令是一种强大的文本搜索工具，它能使用正则表达式搜索文本，并把匹 配的行打印出来。

grep全称是Global Regular Expression Print，表示全局正则表达式版本，它的使用权限是所有用户。

grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展，支持更多的re元字符， fgrep就是fixed grep或fast grep，

它们把所有的字母都看作单词，也就是说，正则表达式中的元字符表示回其自身的字面意义，不再特殊。

linux使用GNU版本的grep。它功能更强，可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。

2.格式
grep [options]

3.主要参数
grep --help

[options]主要参数：

	-c：只输出匹配行的计数。
	-i：不区分大小写。
	-h：查询多文件时不显示文件名。
	-l：查询多文件时只输出包含匹配字符的文件名。
	-n：显示匹配行及 行号。
	-s：不显示不存在或无匹配文本的错误信息。
	-v：显示不包含匹配文本的所有行[排除的意思]。
	-o：只输出匹配的部分
	--color=auto ：可以将找到的关键词部分加上颜色的显示
	-V： 打印grep的版本号
	-E： 解释PATTERN作为扩展正则表达式，也就相当于使用egrep。 或操作
	-F:   解释PATTERN作为固定字符串的列表，由换行符分隔，其中任何一个都要匹配。也就相当于使用fgrep。
	-G:   将范本样式视为普通的表示法来使用。这是默认值。加不加都是使用grep。
匹配控制选项
	-e :  使用PATTERN作为模式。这可以用于指定多个搜索模式，或保护以连字符（ - ）开头的图案。指定字符串做为查找文件内容的样式。   
	-f :  指定规则文件，其内容含有一个或多个规则样式，让grep查找符合规则条件的文件内容，格式为每行一个规则样式。
	-i :  搜索时候忽略大小写
	-v:  反转匹配，选择没有被匹配到的内容。
	-w：匹配整词，精确地单词,单词的两边必须是非字符符号(即不能是字母数字或下划线)
	-x：仅选择与整行完全匹配的匹配项。精确匹配整行内容(包括行首行尾那些看不到的空格内容都要完全匹配)
	-y：此参数的效果和指定“-i”参数相同。

一般输出控制选项：
	-c： 抑制正常输出;而是为每个输入文件打印匹配线的计数。
	--color [= WHEN]：让关键字高亮显示，如--color=auto
	-L：列出文件内容不符合指定的范本样式的文件名称
	-l : 列出文件内容符合指定的范本样式的文件名称。
	-m num：当匹配内容的行数达到num行后,grep停止搜索,并输出停止前搜索到的匹配内容
	-o: 只输出匹配的具体字符串,匹配行中其他内容不会输出
	-q：安静模式,不会有任何输出内容,查找到匹配内容会返回0,未查找到匹配内容就返回非0
	-s：不会输出查找过程中出现的任何错误消息，-q和-s选项因为与其他系统的grep有兼容问题，shell脚本应该避免使用-q和-s，并且应该将标准和错误输出重定向到/dev/null 代替。

输出线前缀控制：
	-b：输出每一个匹配行(或匹配的字符串)时在其前附加上偏移量(从文件第一个字符到该匹配内容之间的字节数)
	-H：在每一个匹配行之前加上文件名一起输出(针对于查找单个文件),当查找多个文件时默认就会输出文件名
	-h：禁止输出上的文件名的前缀。无论查找几个文件都不会在匹配内容前输出文件名
	--label = LABEL：显示实际来自标准输入的输入作为来自文件LABEL的输入。这是特别在实现zgrep等工具时非常有用，例如gzip -cd foo.gz | grep --label = foo -H的东西。看到 也是-H选项。
	-n：输出匹配内容的同时输出其所在行号。
	-T：初始标签确保实际行内容的第一个字符位于制表位上，以便对齐标签看起来很正常。在匹配信息和其前的附加信息之间加入tab以使格式整齐。

上下文线控制选项：
	-A num：匹配到搜索到的行以及该行下面的num行
	-B num：匹配到搜索到的行以及该行上面的num行
	-C num：匹配到搜索到的行以及上下各num行
文件和目录选择选项：
	-a： 处理二进制文件，就像它是文本;这相当于--binary-files = text选项。不忽略二进制的数据。  
	--binary-files = TYPE：如果文件的前几个字节指示文件包含二进制数据，则假定该文件为类型TYPE。默认情况下，TYPE是二进制的，grep通常输出一行消息二进制文件匹配，或者如果没有匹配则没有消息。如果TYPE不匹配，grep假定二进制文件不匹配;这相当于-I选项。如果TYPE是文本，则grep处理a二进制文件，如果它是文本;这相当于-a选项。警告：grep --binary-files = text可能会输出二进制的垃圾，如果输出是一个终端和如果可能有讨厌的副作用终端驱动程序将其中的一些解释为命令。
		-D：如果输入文件是设备，FIFO或套接字，请使用ACTION处理。默认情况下，读取ACTION，这意味着设备被读取，就像它们是普通文件一样。如果跳过ACTION，设备为 默默地跳过。
		-d:  如果输入文件是目录，请使用ACTION处理它。默认情况下，ACTION是读的，这意味着目录被读取，就像它们是普通文件一样。如果跳过ACTION，目录将静默跳过。如果ACTION是recurse，grep将递归读取每个目录下的所有文件;这是相当于-r选项。
	--exclude=GLOB：跳过基本名称与GLOB匹配的文件（使用通配符匹配）。文件名glob可以使用*，？和[...]作为通配符，和\引用通配符或反斜杠字符。搜索其文件名和GLOB通配符相匹配的文件的内容来查找匹配使用方法:grep -H --exclude=c* "old" ./*  c*是通配文件名的通配符./* 指定需要先通配文件名的文件的范围,必须要给*,不然就匹配不出内容,(如果不给*,带上-r选项也可以匹配)
	--exclude-from = FILE：在文件中编写通配方案,grep将不会到匹配方案中文件名的文件去查找匹配内容
	--exclude-dir = DIR：匹配一个目录下的很多内容同时还要让一些子目录不接受匹配,就使用此选项。
		--include = GLOB：仅搜索其基本名称与GLOB匹配的文件（使用--exclude下所述的通配符匹配）。
	-R ,-r :以递归方式读取每个目录下的所有文件; 这相当于-d recurse选项。
其他选项：
	--line-buffered： 在输出上使用行缓冲。这可能会导致性能损失。
	--mmap：启用mmap系统调用代替read系统调用
	-U：将文件视为二进制。
	-z：将输入视为一组行，每一行由一个零字节（ASCII NUL字符）而不是a终止新队。与-Z或--null选项一样，此选项可以与排序-z等命令一起使用来处理任意文件名。
	-a   --text   #不要忽略二进制的数据。 将 binary 文件以 text 文件的方式搜寻数据 
	-A<显示行数>   --after-context=<显示行数>   #除了显示符合范本样式的那一列之外，并显示该行之后的内容。   
	-b   --byte-offset   #在显示符合样式的那一行之前，标示出该行第一个字符的编号。   
	-B<显示行数>   --before-context=<显示行数>   #除了显示符合样式的那一行之外，并显示该行之前的内容。   
	-c    --count   #计算符合样式的行数。   
	-C<显示行数>    --context=<显示行数>或-<显示行数>   #除了显示符合样式的那一行之外，并显示该行之前后的内容。   
	-d <动作>      --directories=<动作>   #当指定要查找的是目录而非文件时，必须使用这项参数，否则grep指令将回报信息并停止动作。   
	-e<范本样式>  --regexp=<范本样式>   #指定字符串做为查找文件内容的样式。   
	-E      --extended-regexp   #将样式为延伸的普通表示法来使用。   
	-f<规则文件>  --file=<规则文件>   #指定规则文件，其内容含有一个或多个规则样式，让grep查找符合规则条件的文件内容，格式为每行一个规则样式。   
	-F   --fixed-regexp   #将样式视为固定字符串的列表。   
	-G   --basic-regexp   #将样式视为普通的表示法来使用。   
	-h   --no-filename   #在显示符合样式的那一行之前，不标示该行所属的文件名称。   
	-H   --with-filename   #在显示符合样式的那一行之前，表示该行所属的文件名称。   
	-i    --ignore-case   #忽略字符大小写的差别。   
	-l    --file-with-matches   #列出文件内容符合指定的样式的文件名称。   
	-L   --files-without-match   #列出文件内容不符合指定的样式的文件名称。   
	-n   --line-number   #在显示符合样式的那一行之前，标示出该行的列数编号。   
	-q   --quiet或--silent   #不显示任何信息。   
	-r   --recursive   #此参数的效果和指定“-d recurse”参数相同。   
	-s   --no-messages   #不显示错误信息。   
	-v   --revert-match   #显示不包含匹配文本的所有行。   
	-V   --version   #显示版本信息。   
	-w   --word-regexp   #只显示全字符合的列。   
	-x    --line-regexp   #只显示全列符合的列。   
	-y   #此参数的效果和指定“-i”参数相同。
	--color=auto ：可以将找到的关键词部分加上颜色的显示



grep 'hello' ./* -r > hello.txt  去指定目录下递归查找子目录搜索所有含‘hello’的文件

pattern正则表达式主要参数：

	\ ： 忽略正则表达式中特殊字符的原有含义。
	^ ：匹配正则表达式的开始行。
	$ : 匹配正则表达式的结束行。
	\< ：从匹配正则表达 式的行开始。
	\> ：到匹配正则表达式的行结束。
	[ ] ：单个字符，如[A]即A符合要求 。
	[ - ] ：范围，如[A-Z]，即A、B、C一直到Z都符合要求 。
	. ：所有的单个字符。
	* ：有字符，长度可以为0。

4.grep命令使用简单实例
$ grep ‘test’ d*
$ grep ‘’  d*

显示所有以d开头的文件中包含 test的行。

$ grep ‘test’ aa bb cc

显示在aa，bb，cc文件中匹配test的行。

$ grep ‘[a-z]\{5\}’ aa

显示所有包含每个字符串至少有5个连续小写字符的字符串的行。

$ grep ‘w\(es\)t.*\1′ aa

如果west被匹配，则es就被存储到内存中，并标记为1，然后搜索任意个字符(.*)，这些字符后面紧跟着 另外一个es(\1)，找到就显示该行。

如果用egrep或grep -E，就不用”\”号进转义，直接写成’w(es)t.*\1′就可以了。

5.grep命令使用复杂实例
明确要求搜索子目录：

grep -r

或忽略子目录：grep -d skip

如果有很多输出时，您可以通过管道将其转到’less’上阅读：

$ grep magic /usr/src/Linux/Documentation/* | less

这样，您就可以更方便地阅读。

有一点要注意，您必需提供一个文件过滤方式(搜索全部文件的话用 *)。如果您忘了，’grep’会一直等着，直到该程序被中断。

如果您遇到了这样的情况，按 ，然后再试。

下面还有一些有意思的命令行参数：
grep -i pattern files ：不区分大小写地搜索。默认情况区分大小写，
grep -l pattern files ：只列出匹配的文件名，
grep -L pattern files ：列出不匹配的文件名，
grep -w pattern files ：只匹配整个单词，而不是字符串的一部分(如匹配’magic’，而不是’magical’)，
grep -C number pattern files ：匹配的上下文分别显示[number]行，
grep pattern1 | pattern2 files ：显示匹配 pattern1 或 pattern2 的行，

例如：
grep "abc\|xyz" testfile 表示过滤包含abc或xyz的行
grep pattern1 files | grep pattern2 ：显示既匹配 pattern1 又匹配 pattern2 的行。
grep -n pattern files 即可显示行号信息
grep -c pattern files 即可查找总行数

这里还有些用于搜索的特殊符号：

\< 和 \> 分别标注单词的开始与结尾。

例如：

grep man * 会匹配 ‘Batman’、’manic’、’man’等，
grep ‘\<man’ * 匹配’manic’和’man’，但不是’Batman’，
grep ‘\<man\>’ 只匹配’man’，而不是’Batman’或’manic’等其他的字符串。
‘^’：指匹配的字符串在行首，
‘$’：指匹配的字符串在行 尾， 


看IP
mac@macdeMacBook-Pro php % ifconfig | grep 'inet ' | awk -F " " '{print $2}' | awk '{print $1}' | grep -v '^127' | grep -v '192'
mac@macdeMacBook-Pro php % ifconfig | grep 'inet ' | awk -F\: '{print $2}' | awk '{print $1}' | grep -v '^127' | grep -v '192'
mac@macdeMacBook-Pro php % ifconfig | grep 'inet addr'|awk -F\: '{print $2}'|awk '{print $1}' | grep -v '^127' | grep -v '192'

只输出匹配的部分
mac@macdeMacBook-Pro php % grep -o 'commendsid=[0-9]\{1,\}' /log/nginx/2021-04-05/access.log
commendsid=9
commendsid=888886
commendsid=66668
mac@macdeMacBook-Pro php % grep -o '.*commendsid=[0-9]\{1,\}.*' /log/nginx/2021-04-05/access.log
190.18.168.6 baidu.com - [05/Apr/2021:06:07:11 +0800] "GET /wxshare/wxshare?url=https%3A%2F%2Fbaidu.com%2F%3Fcommendsid%3D888886 HTTP/1.1" 200 851 "https://baidu.com/?commendsid=888886" "Mozilla/5.0 (Linux; Android 10; Redmi K30 Pro Build/QKQ1.191117.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.62 XWEB/2767  Mobile Safari/537.36  MicroMessenger/8.0.1.1841 Process/toolsmp WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64" 888886
mac@macdeMacBook-Pro php % grep 'commendsid=[0-9]\{1,\}' /log/nginx/2021-04-05/access.log
190.18.168.6 baidu.com - [05/Apr/2021:06:07:11 +0800] "GET /wxshare/wxshare?url=https%3A%2F%2Fbaidu.com%2F%3Fcommendsid%3D888886 HTTP/1.1" 200 851 "https://baidu.com/?commendsid=888886" "Mozilla/5.0 (Linux; Android 10; Redmi K30 Pro Build/QKQ1.191117.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.62 XWEB/2767  Mobile Safari/537.36  MicroMessenger/8.0.1.1841 Process/toolsmp WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64" 888886

mac@macdeMacBook-Pro php % grep -o 'commendsid=[0-9]\{1,\}' /log/nginx/*/access.log
/log/nginx/2021-04-05/access.log:commendsid=9
/log/nginx/2021-04-06/access.log:commendsid=9

mac@macdeMacBook-Pro php % grep -oh 'commendsid=[0-9]\{1,\}' /log/nginx/*/access.log
commendsid=9
commendsid=9

# 查询多文件时不显示文件名
mac@macdeMacBook-Pro php % grep 'commendsid=[0-9]\{1,\}' /log/nginx/*/access.log
/log/nginx/2021-04-05/access.log:190.18.168.6 www.baidu.com - [05/Apr/2021:06:07:11 +0800] "GET /wxshare/wxshare?url=https%3A%2F%2Fbaidu.com%2F%3Fcommendsid%3D888886 HTTP/1.1" 200 851 "https://baidu.com/?commendsid=888886" "Mozilla/5.0 (Linux; Android 10; Redmi K30 Pro Build/QKQ1.191117.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.62 XWEB/2767  Mobile Safari/537.36  MicroMessenger/8.0.1.1841 Process/toolsmp WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64" 888886
/log/nginx/2021-04-06/access.log:190.18.168.6 fanyi.baidu.com - [05/Apr/2021:06:07:11 +0800] "GET /wxshare/wxshare?url=https%3A%2F%2Fbaidu.com%2F%3Fcommendsid%3D888886 HTTP/1.1" 200 851 "https://baidu.com/?commendsid=888886" "Mozilla/5.0 (Linux; Android 10; Redmi K30 Pro Build/QKQ1.191117.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.62 XWEB/2767  Mobile Safari/537.36  MicroMessenger/8.0.1.1841 Process/toolsmp WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64" 888886

mac@macdeMacBook-Pro php % grep -h 'commendsid=[0-9]\{1,\}' /log/nginx/*/access.log
190.18.168.6 www.baidu.com - [05/Apr/2021:06:07:11 +0800] "GET /wxshare/wxshare?url=https%3A%2F%2Fbaidu.com%2F%3Fcommendsid%3D888886 HTTP/1.1" 200 851 "https://baidu.com/?commendsid=888886" "Mozilla/5.0 (Linux; Android 10; Redmi K30 Pro Build/QKQ1.191117.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.62 XWEB/2767  Mobile Safari/537.36  MicroMessenger/8.0.1.1841 Process/toolsmp WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64" 888886
190.18.168.6 fanyi.baidu.com - [05/Apr/2021:06:07:11 +0800] "GET /wxshare/wxshare?url=https%3A%2F%2Fbaidu.com%2F%3Fcommendsid%3D888886 HTTP/1.1" 200 851 "https://baidu.com/?commendsid=888886" "Mozilla/5.0 (Linux; Android 10; Redmi K30 Pro Build/QKQ1.191117.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.62 XWEB/2767  Mobile Safari/537.36  MicroMessenger/8.0.1.1841 Process/toolsmp WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64" 888886




memoName